# Field 是 pydantic 的，用于 pydantic 模型的字段校验，和 Query Path Body 有类似的参数

# 使用 Field：提供了更多的灵活性和控制能力，允许你定义更复杂的校验和元数据。
# 约束：可以为字段添加约束，如 max_length, gt, lt, ge, le 等。例如，在你的示例中，description 的最大长度被限制为 300，price 被限制为大于 0。
# 默认值：可以通过 default 或 default_factory 设置字段的默认值。
# 描述：可以为字段添加描述，以便在自动生成的文档中显示。这有助于 API 使用者理解字段的含义。
# 示例：可以提供字段的示例值，方便文档生成。
#
# 不使用 Field：模型更简单，但功能也有限，通常适用于不需要额外约束的情况。
# 简单声明：直接定义字段时，只有类型信息，没有额外的约束或元数据。
# 缺乏灵活性：不能添加额外的验证逻辑或者描述信息。

from typing import Annotated

from fastapi import Body, FastAPI
from pydantic import BaseModel, Field

app = FastAPI()


class Item(BaseModel):
    name: str
    description: str | None = Field(default=None,  max_length=300)
    price: float = Field(gt=0)
    tax: float | None = None


@app.post("/items/{item_id}")
async def update_item(item_id: int, item: Annotated[Item, Body(embed=True)]):
    results = {"item_id": item_id, "item": item}
    return results
